home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / lxml / builder.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2008-10-13  |  3.0 KB  |  121 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. import lxml.etree as ET
  5.  
  6. try:
  7.     from functools import partial
  8. except ImportError:
  9.     
  10.     def partial(func, tag):
  11.         return (lambda : func(tag, *args, **kwargs))
  12.  
  13.  
  14.  
  15. try:
  16.     callable
  17. except NameError:
  18.     
  19.     def callable(f):
  20.         return hasattr(f, '__call__')
  21.  
  22.  
  23.  
  24. try:
  25.     basestring = __builtins__['basestring']
  26. except (NameError, KeyError):
  27.     basestring = str
  28.  
  29.  
  30. try:
  31.     unicode = __builtins__['unicode']
  32. except (NameError, KeyError):
  33.     unicode = str
  34.  
  35.  
  36. class ElementMaker(object):
  37.     
  38.     def __init__(self, typemap = None, namespace = None, nsmap = None, makeelement = None):
  39.         if namespace is not None:
  40.             self._namespace = '{' + namespace + '}'
  41.         else:
  42.             self._namespace = None
  43.         if nsmap:
  44.             self._nsmap = dict(nsmap)
  45.         else:
  46.             self._nsmap = None
  47.         if makeelement is not None:
  48.             self._makeelement = makeelement
  49.         else:
  50.             self._makeelement = ET.Element
  51.         if typemap:
  52.             typemap = typemap.copy()
  53.         else:
  54.             typemap = { }
  55.         
  56.         def add_text(elem, item):
  57.             if len(elem):
  58.                 if not elem[-1].tail:
  59.                     pass
  60.                 elem[-1].tail = '' + item
  61.             elif not elem.text:
  62.                 pass
  63.             elem.text = '' + item
  64.  
  65.         if str not in typemap:
  66.             typemap[str] = add_text
  67.         
  68.         if unicode not in typemap:
  69.             typemap[unicode] = add_text
  70.         
  71.         
  72.         def add_dict(elem, item):
  73.             attrib = elem.attrib
  74.             for k, v in item.items():
  75.                 if isinstance(v, basestring):
  76.                     attrib[k] = v
  77.                     continue
  78.                 attrib[k] = typemap[type(v)](None, v)
  79.             
  80.  
  81.         if dict not in typemap:
  82.             typemap[dict] = add_dict
  83.         
  84.         self._typemap = typemap
  85.  
  86.     
  87.     def __call__(self, tag, *children, **attrib):
  88.         get = self._typemap.get
  89.         if self._namespace is not None and tag[0] != '{':
  90.             tag = self._namespace + tag
  91.         
  92.         elem = self._makeelement(tag, nsmap = self._nsmap)
  93.         if attrib:
  94.             get(dict)(elem, attrib)
  95.         
  96.         for item in children:
  97.             if callable(item):
  98.                 item = item()
  99.             
  100.             t = get(type(item))
  101.             if t is None:
  102.                 if ET.iselement(item):
  103.                     elem.append(item)
  104.                     continue
  105.                 
  106.                 raise TypeError('bad argument type: %r' % item)
  107.                 continue
  108.             v = t(elem, item)
  109.             if v:
  110.                 get(type(v))(elem, v)
  111.                 continue
  112.         
  113.         return elem
  114.  
  115.     
  116.     def __getattr__(self, tag):
  117.         return partial(self, tag)
  118.  
  119.  
  120. E = ElementMaker()
  121.